const {body, param} = require('express-validator')
const validate = require('../middleware/validate')
const User = require('../models/User')
const {decrypt, generateRegexFromArray} = require('../utils/utils')
const roles = require('../enum/roles')
//注册
exports.register = validate([
  body('username')
    .notEmpty()
    .withMessage('用户名不能为空')
    .custom(async (username) => {
      const user = await User.findOne({username})
      if (user) {
        return Promise.reject('用户名已存在')
      }
    }),
  body('password').notEmpty().withMessage('密码不能为空'),
  body('email')
    .notEmpty()
    .withMessage('邮箱不能为空')
    .isEmail()
    .withMessage('邮箱格式不正确')
    .bail()
    .custom(async (email) => {
      const user = await User.findOne({email})
      if (user) {
        return Promise.reject('邮箱已存在')
      }
    }),
])

//登陆
exports.login = [
  validate([
    body('username').notEmpty().withMessage('用户名不能为空'),
    body('password').notEmpty().withMessage('密码不能为空'),
  ]),
  validate([
    body('username').custom(async (username, {req}) => {
      const user = await User.findOne({username}).select('+password')
      if (!user) {
        return Promise.reject('用户不存在')
      }
      if (user && user.roles.includes('blacklist')) {
        return Promise.reject('你已被拉黑，请联系管理员')
      }
      // 将数据挂载到请求对象中，后续的中间件也可以使用了
      req.user = user
    }),
  ]),
  validate([
    body('password').custom(async (password, {req}) => {
      // console.log('密码: ', password)
      // console.log('解密的密码: ', decrypt(password))
      // console.log('数据库存的密码: ', req.user.password, decrypt(req.user.password))
      if (decrypt(password) !== decrypt(req.user.password)) {
        return Promise.reject("登录密码错误");
      }
    }),
  ]),
]
// 修改权限
exports.changeRole = validate([
  body('id').notEmpty().withMessage('id不能为空'),
  body('roles').notEmpty().withMessage('roles不能为空'),
  body('roles').matches(generateRegexFromArray(roles).regex).withMessage(generateRegexFromArray(roles).error),
])
//作者信息
exports.authorinfo = validate([
  param('id').notEmpty().withMessage('作者ID不能为空'),
  param('id').isMongoId().withMessage('作者ID格式不正确'),
  param('id').custom(async (id) => {
    try {
      const user = await User.findById(id)
      if (!user) {
        return Promise.reject('作者不存在')
      }
    } catch (error) {
      Promise.reject('作者不存在')
    }
    return true
  })
])

//修改自己的密码

exports.changePwd = [
  validate([
    body('_id').notEmpty().withMessage('id不能为空'),
    body('_id').custom(async (id, {req}) => {
      console.log('id: ', id)
      const user = await User.findById(id).select('+password')
      if (!user) {
        return Promise.reject('用户不存在')
      }
      if (user && user.roles.includes('blacklist')) {
        return Promise.reject('你已被拉黑，请联系管理员')
      }
      // 将数据挂载到请求对象中，后续的中间件也可以使用了
      req.user = user
      console.log('req.user:', req.user)
    })
  ]),
  validate([
    body('oldPassword').notEmpty().withMessage('旧密码不能为空'),
    body('oldPassword').custom(async (password, {req}) => {
      console.log('密码: ', password)
      console.log('解密的密码: ', decrypt(password))
      console.log('数据库存的密码: ', decrypt(req.user.password))
      console.log('解密的密码是否等于数据库解密的密码：', decrypt(password) == decrypt(req.user.password))
      if (decrypt(password) !== decrypt(req.user.password)) {
        return Promise.reject('旧密码错误')
      }
    }),
    body('newPassword').notEmpty().withMessage('新密码不能为空'),
  ])
]

//修改作者信息
exports.updateAuthorInfo = [
  validate([
    body('_id').notEmpty().withMessage('id不能为空'),
    body('_id').custom(async (id, {req}) => {
      console.log('id: ', id)
      const user = await User.findById(id)
      if (!user) {
        return Promise.reject('用户不存在')
      }
      if (user && user.roles.includes('blacklist')) {
        return Promise.reject('你已被拉黑，请联系管理员')
      }
      console.log('req._id.toString():', req._id.toString(), req._id.toString() !== id)
      if (req._id.toString() !== id) {
        return Promise.reject('只能自己修改自己的信息')
      }
    })
  ]),
  validate([
    body('nikname').notEmpty().withMessage('昵称不能为空'),
    body('avatar').notEmpty().withMessage('头像不能为空'),
    body('email').notEmpty().withMessage('邮箱不能为空'),
    body('signature').notEmpty().withMessage('简介不能为空'),
  ])
]
